home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / GDIDIB.PAK / MISC.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  7KB  |  273 lines

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993 - 1995  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   misc.c
  9. //
  10. //  PURPOSE:  Contains all helper functions "global" to the application.
  11. //
  12. //  FUNCTIONS:
  13. //    CenterWindow     - Center one window over another.
  14. //    SetWindowTitle   - Sets the title of the application window.
  15. //    InitDIBSection   - Initializes the bitmap surface of the current DIB
  16. //                       section and paints the display.
  17. //    RemoveDIBSection - Removes the current DIB section.
  18. //
  19. //  COMMENTS:
  20. //
  21. //
  22.  
  23. #include <windows.h>       // required for all Windows applications
  24. #include <commctrl.h>      // prototypes and structure for the common controls.
  25.  
  26. #include "globals.h"       // prototypes specific to this application
  27. #include "resource.h"
  28. #include "toolbar.h"
  29.  
  30. //
  31. //  FUNCTION: CenterWindow(HWND, HWND)
  32. //
  33. //  PURPOSE:  Center one window over another.
  34. //
  35. //  PARAMETERS:
  36. //    hwndChild - The handle of the window to be centered.
  37. //    hwndParent- The handle of the window to center on.
  38. //
  39. //  RETURN VALUE:
  40. //
  41. //    TRUE  - Success
  42. //    FALSE - Failure
  43. //
  44. //  COMMENTS:
  45. //
  46. //    Dialog boxes take on the screen position that they were designed
  47. //    at, which is not always appropriate. Centering the dialog over a
  48. //    particular window usually results in a better position.
  49. //
  50.  
  51. BOOL CenterWindow(HWND hwndChild, HWND hwndParent)
  52. {
  53.     RECT    rcChild, rcParent;
  54.     int     cxChild, cyChild, cxParent, cyParent;
  55.     int     cxScreen, cyScreen, xNew, yNew;
  56.     HDC     hdc;
  57.  
  58.     // Get the Height and Width of the child window
  59.     GetWindowRect(hwndChild, &rcChild);
  60.     cxChild = rcChild.right - rcChild.left;
  61.     cyChild = rcChild.bottom - rcChild.top;
  62.  
  63.     // Get the Height and Width of the parent window
  64.     GetWindowRect(hwndParent, &rcParent);
  65.     cxParent = rcParent.right - rcParent.left;
  66.     cyParent = rcParent.bottom - rcParent.top;
  67.  
  68.     // Get the display limits
  69.     hdc = GetDC(hwndChild);
  70.     cxScreen = GetDeviceCaps(hdc, HORZRES);
  71.     cyScreen = GetDeviceCaps(hdc, VERTRES);
  72.     ReleaseDC(hwndChild, hdc);
  73.  
  74.     // Calculate new X position, then adjust for screen
  75.     xNew = rcParent.left + ((cxParent - cxChild) / 2);
  76.     if (xNew < 0)
  77.     {
  78.         xNew = 0;
  79.     }
  80.     else if ((xNew + cxChild) > cxScreen)
  81.     {
  82.         xNew = cxScreen - cxChild;
  83.     }
  84.  
  85.     // Calculate new Y position, then adjust for screen
  86.     yNew = rcParent.top  + ((cyParent - cyChild) / 2);
  87.     if (yNew < 0)
  88.     {
  89.         yNew = 0;
  90.     }
  91.     else if ((yNew + cyChild) > cyScreen)
  92.     {
  93.         yNew = cyScreen - cyChild;
  94.     }
  95.  
  96.     // Set it, and return
  97.     return SetWindowPos(hwndChild,
  98.                         NULL,
  99.                         xNew, yNew,
  100.                         0, 0,
  101.                         SWP_NOSIZE | SWP_NOZORDER);
  102. }
  103.  
  104.  
  105. //
  106. //  FUNCTION: SetWindowTitle(HWND, LPSTR)
  107. //
  108. //  PURPOSE: Sets the title of the application window
  109. //
  110. //  PARAMETERS:
  111. //    hwnd         - The window handle.
  112. //    lpszFileName - Pointer to file name string.
  113. //
  114. //  RETURN VALUE:
  115. //    none.
  116. //
  117. //  COMMENTS:
  118. //
  119. //
  120.  
  121. void SetWindowTitle(HWND hwnd, LPSTR lpszFileName)
  122. {   
  123.     int nChars;
  124.     char szTitle[MAX_PATH];   
  125.     LPBITMAPINFOHEADER lpbih;
  126.     
  127.     if (hDIBInfo)
  128.         lpbih = (LPBITMAPINFOHEADER)GlobalLock(hDIBInfo);
  129.                
  130.     nChars = lstrlen(lpszFileName);
  131.     
  132.     if (nChars && lpbih)
  133.     {   
  134.         char szChanges[2] = { 0, 0 };
  135.         
  136.         if (fChanges)
  137.             szChanges[0] = '*';
  138.         
  139.         // a DIB Section exists
  140.         wsprintf(szTitle, 
  141.                  "%s - %s (%ld x %ld x %d BPP)%s",
  142.                  szAppName, 
  143.                  lpszFileName,
  144.                  lpbih->biWidth,
  145.                  lpbih->biHeight,
  146.                  lpbih->biBitCount,
  147.                  szChanges);    
  148.       
  149.         // save current file name
  150.         lstrcpy((LPSTR)szCurrentFile, lpszFileName);     
  151.         
  152.         GlobalUnlock(hDIBInfo);
  153.     }    
  154.     else
  155.         // no DIB Section so just show application description text
  156.         wsprintf(szTitle, "%s", SZDESCRIPTION);
  157.                   
  158.     SetWindowText(hwnd, szTitle);   
  159. }     
  160.  
  161.     
  162. //
  163. //  FUNCTION: InitDIBSection(HWND)
  164. //
  165. //  PURPOSE: Initialize the bitmap surface and paint the display.
  166. //
  167. //  PARAMETERS:
  168. //    hwnd  - The window displaying the bitmap.
  169. //
  170. //  RETURN VALUE:
  171. //    none.
  172. //
  173. //  COMMENTS:
  174. //
  175. //
  176.                         
  177. void InitDIBSection(HWND hwnd)
  178. {
  179.     HDC hdc, hdcMem;
  180.     HBITMAP hbmOld;
  181.     HPALETTE hpalOld = NULL;
  182.     HPALETTE hpalOldMem = NULL;
  183.     LPBITMAPINFOHEADER lpbih;
  184.     
  185.     if (!hwnd || !hDIBInfo || !hBitmap)
  186.         return;
  187.         
  188.     lpbih = (LPBITMAPINFOHEADER)GlobalLock(hDIBInfo);
  189.     if (!lpbih)
  190.         return;
  191.           
  192.     hdc = GetDC(hwnd);
  193.     hdcMem = CreateCompatibleDC(hdc);  
  194.     hbmOld = SelectObject(hdcMem, hBitmap);
  195.  
  196.     if (hPalette)
  197.     {
  198.         hpalOld = SelectPalette(hdc, hPalette, FALSE);
  199.         RealizePalette(hdc);
  200.         hpalOldMem = SelectPalette(hdcMem, hPalette, FALSE);
  201.     }
  202.  
  203.     PatBlt(hdcMem, 0, 0, lpbih->biWidth, lpbih->biHeight, WHITENESS);    
  204.     PatBlt(hdc,    0, 0, lpbih->biWidth, lpbih->biHeight, WHITENESS);   
  205.  
  206.     if (hpalOldMem)
  207.         SelectPalette(hdcMem, hpalOldMem, FALSE);
  208.     if (hpalOld)
  209.         SelectPalette(hdc, hpalOld, FALSE);
  210.  
  211.     SelectObject(hdcMem, hbmOld);
  212.     DeleteDC(hdcMem);
  213.     ReleaseDC(hwnd, hdc);
  214.     GlobalUnlock(hDIBInfo);
  215. }
  216.  
  217.  
  218. //
  219. //  FUNCTION: RemoveDIBSection()
  220. //
  221. //  PURPOSE: Removes the current DIB section and resets global variables
  222. //
  223. //  PARAMETERS:
  224. //    none.
  225. //
  226. //  RETURN VALUE:
  227. //    none.
  228. //
  229. //  COMMENTS:
  230. //
  231. //
  232.  
  233. void RemoveDIBSection()
  234. {
  235.     if (hDIBInfo) 
  236.     {
  237.         // free old DIB header
  238.         GlobalFree(hDIBInfo);
  239.         hDIBInfo = NULL;
  240.     }
  241.   
  242.     if (hBitmap)
  243.     {
  244.         // remove existing DIB section 
  245.         DeleteObject(hBitmap); 
  246.         hBitmap = NULL;
  247.     }
  248.     
  249.     // bits are gone
  250.     lpvBits = NULL;        
  251.                         
  252.     if (hPalette)                        
  253.     {    
  254.         // remove existing palette object
  255.         DeleteObject(hPalette);
  256.         hPalette = NULL;
  257.     }
  258.              
  259.     // reset the drawing objects to defaults
  260.     InitDrawObjects();
  261.              
  262.     // if there were edits, they are gone
  263.     fChanges = FALSE;  
  264.     
  265.     // update status of menu and toolbar  
  266.     EnableMenuItem(hMenu, IDM_FILESAVE, MF_DISABLED);
  267.     SendMessage(hWndToolbar, TB_ENABLEBUTTON, IDM_FILESAVE, MAKELONG(FALSE, 0));  
  268.     EnableMenuItem(hMenu, IDM_FILESAVEAS, MF_DISABLED);    
  269.     EnableMenuItem(hMenu, IDM_FILECLOSE, MF_DISABLED);
  270.     EnableMenuItem(hMenu, IDM_CLEAR, MF_DISABLED);
  271. }
  272.  
  273.